package qc.module.ehs.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.enums.EhsAccidentLevelEnum;
import qc.common.core.exception.QCPromptException;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.common.core.utils.DateUtil;
import qc.common.core.utils.IdentifierUtil;
import qc.module.ehs.dto.accidentrecord.AccidentRecordDto;
import qc.module.ehs.dto.accidentrecord.AccidentRecordQueryConditionDto;
import qc.module.ehs.entity.EhsAccidentRecord;
import qc.module.ehs.mapper.EhsAccidentRecordMapper;
import qc.module.ehs.repository.EhsAccidentRecordRepository;

import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 事故记录接口Service
 * @author QuCheng Tech
 * @since 2024/10/29
 */
@Service
public class EhsAccidentRecordService {
    @Autowired
    private EhsAccidentRecordRepository repository;

    /**
     * 查询记录
     * @param condition 查询条件
     * @return List<AccidentRecordDto>
     * @author QuCheng Tech
     * @since 2024/10/30
     */
    public List<AccidentRecordDto> query(AccidentRecordQueryConditionDto condition) throws QCPromptException {
        if (condition == null)
            throw new QCPromptException("查询条件不能为空");
        if (StringUtils.isBlank(condition.getOrgcode()))
            throw new QCPromptException("组织代码不能为空");

        //查询时间处理
        Date beginDate = null;
        Date endDate = null;
        if (StringUtils.isNotBlank(condition.getBegintm())) {
            try {
                beginDate = DateUtil.parseDate(condition.getBegintm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的开始日期转换错误");
            }
        }
        if (StringUtils.isNotBlank(condition.getEndtm())) {
            try {
                endDate = DateUtil.parseDate(condition.getEndtm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的截止日期转换错误");
            }
        }

        LambdaQueryWrapper<EhsAccidentRecord> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EhsAccidentRecord::getOrgcode, condition.getOrgcode());
        //发生起始时间 >= 开始时间 and 发生结束时间 <= 结束时间
        if (beginDate != null && endDate != null) {
            Date begintm = beginDate;
            Date endtm = endDate;
            wrapper.and(q -> {
                q.ge(EhsAccidentRecord::getTm, begintm).le(EhsAccidentRecord::getTm, endtm);
            });
        }
        if (StringUtils.isNotBlank(condition.getUnitid())) {
            wrapper.eq(EhsAccidentRecord::getUnitid, condition.getUnitid());
        }
        if (condition.getLvl() != null) {
            wrapper.eq(EhsAccidentRecord::getLvl, condition.getLvl());
        }
        if (StringUtils.isNotBlank(condition.getKeywords())) {
            wrapper.and(q -> {
                q.like(EhsAccidentRecord::getTitle, condition.getKeywords()).or()
                        .like(EhsAccidentRecord::getContent, condition.getKeywords()).or()
                        .like(EhsAccidentRecord::getIncidence, condition.getKeywords()).or()
                        .like(EhsAccidentRecord::getDirectcause, condition.getKeywords()).or()
                        .like(EhsAccidentRecord::getIndirectcause, condition.getKeywords()).or()
                        .like(EhsAccidentRecord::getResponsibility, condition.getKeywords()).or()
                        .like(EhsAccidentRecord::getLesson, condition.getKeywords()).or()
                        .like(EhsAccidentRecord::getMeasure, condition.getKeywords()).or()
                        .like(EhsAccidentRecord::getSuggestion, condition.getKeywords());
            });
        }

        List<EhsAccidentRecord> ens = repository.selectList(wrapper);
        if (CollectionUtils.isNotEmpty(ens)) {
            return EhsAccidentRecordMapper.MAPPER.toDtoList(ens);
        }
        return null;
    }

    /**
     * 获取指定
     * @param id 事故记录ID
     * @return AccidentRecordDto
     * @author QuCheng Tech
     * @since 2024/10/30
     */
    public AccidentRecordDto get(String id) {
        EhsAccidentRecord en = repository.selectById(id);
        if (Objects.nonNull(en)) {
            return EhsAccidentRecordMapper.MAPPER.toDto(en);
        }
        return null;
    }

    /**
     * 新增
     * @param dto
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/10/30
     */
    public String add(AccidentRecordDto dto) throws QCPromptException {
        if (dto == null) return QCUnifyReturnValue.Warn("新增对象不能为空");
        if (StringUtils.isBlank(dto.getOrgcode())) return QCUnifyReturnValue.Warn("组织代码不能为空");
        if (StringUtils.isBlank(dto.getTm())) return QCUnifyReturnValue.Warn("发生时间不能为空");
        if (StringUtils.isBlank(dto.getTitle())) return QCUnifyReturnValue.Warn("事故标题不能为空");
        if (StringUtils.isBlank(dto.getDirectcause())) return QCUnifyReturnValue.Warn("事故直接原因不能为空");
        if (StringUtils.isBlank(dto.getIndirectcause())) return QCUnifyReturnValue.Warn("事故间接原因不能为空");
        if (StringUtils.isBlank(dto.getCausetype())) return QCUnifyReturnValue.Warn("事故原因类型不能为空");
        if (dto.getLvl() < EhsAccidentLevelEnum.ESPECIALLY_MAJOR.getIndex()
                || dto.getLvl() > EhsAccidentLevelEnum.GENERAL.getIndex())
            return QCUnifyReturnValue.Warn("事故等级错误");
        if (dto.getInjurednum() < 0x0) return QCUnifyReturnValue.Warn("重伤人数不能小于0");
        if (dto.getDeathnum() < 0x0) return QCUnifyReturnValue.Warn("死亡人数不能小于0");
        if (dto.getEcoloss() < 0) return QCUnifyReturnValue.Warn("直接经济损失不能小于0");

        //发生时间处理
        Date tm = null;
        if (StringUtils.isNotBlank(dto.getTm())) {
            try {
                tm = DateUtil.parseDate(dto.getTm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("日期转换错误");
            }
        }
        dto.setTm(null);

        EhsAccidentRecord en = EhsAccidentRecordMapper.MAPPER.dtoToEntity(dto);
        en.setId(IdentifierUtil.randomUUID());
        en.setTm(tm);

        if (repository.insert(en) < 0x1) {
            return QCUnifyReturnValue.Warn("保存失败");
        }
        return QCUnifyReturnValue.Success();
    }

    /**
     * 修改
     * @param dto
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/10/30
     */
    public String update(AccidentRecordDto dto) throws QCPromptException {
        if (dto == null) return QCUnifyReturnValue.Warn("新增对象不能为空");
        if (StringUtils.isBlank(dto.getId())) return QCUnifyReturnValue.Warn("ID不能为空");
        if (StringUtils.isBlank(dto.getOrgcode())) return QCUnifyReturnValue.Warn("组织代码不能为空");
        if (StringUtils.isBlank(dto.getTm())) return QCUnifyReturnValue.Warn("发生时间不能为空");
        if (StringUtils.isBlank(dto.getTitle())) return QCUnifyReturnValue.Warn("事故标题不能为空");
        if (StringUtils.isBlank(dto.getDirectcause())) return QCUnifyReturnValue.Warn("事故直接原因不能为空");
        if (StringUtils.isBlank(dto.getIndirectcause())) return QCUnifyReturnValue.Warn("事故间接原因不能为空");
        if (StringUtils.isBlank(dto.getCausetype())) return QCUnifyReturnValue.Warn("事故原因类型不能为空");
        if (dto.getLvl() < EhsAccidentLevelEnum.ESPECIALLY_MAJOR.getIndex()
                || dto.getLvl() > EhsAccidentLevelEnum.GENERAL.getIndex())
            return QCUnifyReturnValue.Warn("事故等级错误");
        if (dto.getInjurednum() < 0x0) return QCUnifyReturnValue.Warn("重伤人数不能小于0");
        if (dto.getDeathnum() < 0x0) return QCUnifyReturnValue.Warn("死亡人数不能小于0");
        if (dto.getEcoloss() < 0) return QCUnifyReturnValue.Warn("直接经济损失不能小于0");
        if (Objects.isNull(repository.selectById(dto.getId())))
            return QCUnifyReturnValue.Warn("修改记录不存在");

        //发生时间处理
        Date tm = null;
        if (StringUtils.isNotBlank(dto.getTm())) {
            try {
                tm = DateUtil.parseDate(dto.getTm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("日期转换错误");
            }
        }
        dto.setTm(null);

        EhsAccidentRecord en = EhsAccidentRecordMapper.MAPPER.dtoToEntity(dto);
        repository.updateById(en);
        en.setTm(tm);
        return QCUnifyReturnValue.Success();
    }

    /**
     * 删除
     * @param id 事故记录ID
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/10/30
     */
    public String delete(String id) {
        repository.deleteById(id);
        return QCUnifyReturnValue.Success();
    }

    /**
     * 查询指定时间段内的安全事故记录集合，可以指定组织代码或单元ID
     *
     * @param orgCode   组织机构代码：可以指定也可以为空
     * @param unitid    单元ID：可以指定也可以为空
     * @param beginTime 起始时间
     * @param endTime   截止时间
     * @author QuCheng Tech
     */
    public List<EhsAccidentRecord> queryAccidentRecordEntities(String orgCode, String unitid, Date beginTime, Date endTime) {
        LambdaQueryWrapper<EhsAccidentRecord> wrapper = new LambdaQueryWrapper<>();
        //组织机构代码：如果有值判断相等
        if (StringUtils.isNotBlank(orgCode))
            wrapper.eq(EhsAccidentRecord::getOrgcode, orgCode);
        //单元ID：如果有值判断相等
        if (StringUtils.isNotBlank(unitid))
            wrapper.eq(EhsAccidentRecord::getUnitid, unitid);
        wrapper.ge(EhsAccidentRecord::getTm, beginTime);
        wrapper.le(EhsAccidentRecord::getTm, endTime);

        //排序，按发生事件降序
        wrapper.orderByDesc(EhsAccidentRecord::getTm);

        return repository.selectList(wrapper);
    }
}
